package org.walkerljl.commons.invoke;

import java.util.Map;

/**
 * 服务调用代理
 *
 * @author lijunlin
 */
public interface ServiceInvokeProxy {

    /**
     * 服务调用
     *
     * @param serviceInterface 服务接口
     * @param serviceImpl      服务接口实现
     * @param methodName       服务方法
     * @return
     * @throws Exception
     */
    Object invoke(String serviceInterface, String serviceImpl, String methodName) throws Exception;

    /**
     * 服务调用
     *
     * @param serviceInterface 服务接口
     * @param serviceImpl      服务接口实现
     * @param methodName       服务方法
     * @param isStaticMethod   是否静态方法
     * @return
     * @throws Exception
     */
    Object invoke(String serviceInterface, String serviceImpl, String methodName,
                  boolean isStaticMethod) throws Exception;

    /**
     * 服务调用
     *
     * @param serviceInterface  服务接口
     * @param serviceImpl       服务接口实现
     * @param methodName        服务方法
     * @param otherParameterMap 其它参数Map，如RPC服务的timeout、group等参数可通过此方式进行传递
     * @return
     * @throws Exception
     */
    Object invoke(String serviceInterface, String serviceImpl, String methodName,
                  Map<String, Object> otherParameterMap) throws Exception;

    /**
     * 服务调用
     *
     * @param serviceInterface  服务接口
     * @param serviceImpl       服务接口实现
     * @param methodName        服务方法
     * @param isStaticMethod    是否静态方法
     * @param otherParameterMap 其它参数Map，如RPC服务的timeout、group等参数可通过此方式进行传递
     * @return
     * @throws Exception
     */
    Object invoke(String serviceInterface, String serviceImpl, String methodName,
                  boolean isStaticMethod, Map<String, Object> otherParameterMap) throws Exception;

    /**
     * 服务调用
     *
     * @param serviceInterface 服务接口
     * @param serviceImpl      服务接口实现
     * @param methodName       服务方法
     * @param paramsJSONString 参数JSON字符串
     * @return
     * @throws Exception
     */
    Object invoke(String serviceInterface, String serviceImpl, String methodName,
                  String paramsJSONString) throws Exception;

    /**
     * 服务调用
     *
     * @param serviceInterface 服务接口
     * @param serviceImpl      服务接口实现
     * @param methodName       服务方法
     * @param paramsJSONString 参数JSON字符串
     * @param isStaticMethod   是否静态方法
     * @return
     * @throws Exception
     */
    Object invoke(String serviceInterface, String serviceImpl, String methodName,
                  String paramsJSONString, boolean isStaticMethod) throws Exception;

    /**
     * 服务调用
     *
     * @param serviceInterface  服务接口
     * @param serviceImpl       服务接口实现
     * @param methodName        服务方法
     * @param paramsJSONString  参数JSON字符串
     * @param otherParameterMap 其它参数Map，如RPC服务的timeout、group等参数可通过此方式进行传递
     * @return
     * @throws Exception
     */
    Object invoke(String serviceInterface, String serviceImpl, String methodName,
                  String paramsJSONString, Map<String, Object> otherParameterMap) throws Exception;

    /**
     * 服务调用
     *
     * @param serviceInterface  服务接口
     * @param serviceImpl       服务接口实现
     * @param methodName        服务方法
     * @param paramsJSONString  参数JSON字符串
     * @param isStaticMethod    是否静态方法
     * @param otherParameterMap 其它参数Map，如RPC服务的timeout、group等参数可通过此方式进行传递
     * @return
     * @throws Exception
     */
    Object invoke(String serviceInterface, String serviceImpl, String methodName,
                  String paramsJSONString, boolean isStaticMethod, Map<String, Object> otherParameterMap) throws Exception;

    /**
     * 获取调用对象
     *
     * @param serviceInterfaceClass 调用接口Class
     * @param otherParameterMap     其它参数Map，如RPC服务的timeout、group等参数可通过此方式进行传递
     * @return
     */
    Object getInvokeObject(Class<?> serviceInterfaceClass, Map<String, Object> otherParameterMap);
}
